package com.itheima.sh.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.xml.bind.SchemaOutputResolver;
import java.util.List;
import java.util.Map;
/*
* 当浏览器 携带id 访问当前controller时
*
* 会访问 queryById方法 将 id作为参数  调用 restTemplate 的getForObject 方法 出入 id 指定 返回类型
*
* 获取查询到的 用户信息
*
*  **微服务**
* 解耦合
*
* */
@RestController
@RequestMapping("consumer")
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;

/*
     此版本 是将 url 写死了
    @GetMapping("{id}")
    public Map queryById(@PathVariable("id") String id){
        //根据 id 远程调用 user_service的方法
        String url = "http://localhost:8081/user/" + id;
        // 调用RestTemplate的getForObject方法，指定url地址和返回值类型
        Map user = restTemplate.getForObject(url, Map.class);
        return user;
    }
*/

    //升级版本  ===========

    //1.注入discoceryClient
    @Autowired
    DiscoveryClient discoveryClient;

    @GetMapping("{id}")
    public Map queryById(@PathVariable("id") String id){

        //1.通过discover 对象 根据服务名称 获取 该服务的实例
        List<ServiceInstance> instances = discoveryClient.getInstances("USER-SERVICE");
        //2.由于根据 索引获取 唯一对象
        ServiceInstance instance = instances.get(0);
        //3.获取 端口号 和 url
        //3.1 可以分别获取 然后 拼接
        String host = instance.getHost();
        int port = instance.getPort();
        //3.2 直接获取 然后 替换
        String s = instance.getUri().toString();
        System.out.println("直接获取的路径为=========================="+s);
        //4.拼接

        //根据 id 远程调用 user_service的方法
        //String url = "http://"+host+":"+port+"/user/" + id;
        String url = s+"/user/" + id;
        // 调用RestTemplate的getForObject方法，指定url地址和返回值类型
        Map user = restTemplate.getForObject(url, Map.class);
        System.out.println(user);
        return user;
    }

    @GetMapping("find/{id}")
    public  Map findbyID(@PathVariable("id")String id){
        //1。通过 DiscoverClient 对象 根据eureka中的 name 获取 要访问的 提供者的的实现类
        List<ServiceInstance> instances = discoveryClient.getInstances("USER-SERVICE");
        ServiceInstance instance = instances.get(0);
        //2.获取路基那个url
        String s = instance.getUri().toString();
        System.out.println("s = " + s);

        String url=s+"/user/"+id;
        //3.通过 RestTemplate 对象发起远程 调用
        Map map = restTemplate.getForObject(url, Map.class);
        System.out.println("map = " + map);
        //4.返回对象
        return  map;

    }
    //Ribbon 客户端(消费者)开启负载均衡 负载均衡指定 服务名称调用
    @GetMapping("ribbon/{id}")
    public Map RibbonAndFind(@PathVariable("id")String id){
        //1.定义指定名称 的微服务名字
        String url="http://user-service/user/" + id; // user-service 微服务名称
        //2.使用RestTemplate 远程调用
        Map forObject = restTemplate.getForObject(url, Map.class);
        System.out.println("forObject = " + forObject);
        return  forObject;
    }

}
